package main

import (
	"fmt"
)

func arrayFunc(arr *[3]int)  {
	(*arr)[0] = 50  // 必须使用小括号将*arr括起来
}

func main() {

	// 数组一旦声明/定义，长度即固定不可动态改变,但现有数组内值可改变。如果没有赋值，为默认值0
	// 数组创建
	// 指定数组长度和类型
	arr := [3]int{1,2,3}
	// 也可不指定长度，go能够自己判断长度
	arr2 := [...]int{4,5,6,7,8,9,11,23}
	// 也可指定索引下的值
	arr3 := [3]int{1:20, 0:10, 2:30}
	mid := len(arr) / 2
	s := &arr
	fmt.Println(mid, arr, "\n",arr2, "\n", arr3)
	fmt.Printf(">> %v, %T, %T, %T\n", arr2[:2], arr2[:2], s, arr2[:])
	fmt.Println(">>", arr2[2:])

	arr[0] = 4
	fmt.Println(arr)
	//arrAppend := append(arr, 6)  //指定了长度不能append
	//fmt.Println(arrAppend)

	arr4 := arr
	arr4[1] = 5
	fmt.Println(arr4, arr)

	arr5 := []int{1,2,3,4,5,6}  // 未指定长度，即slice，可append
	arr6 := append(arr5, 7)
	fmt.Println(arr6)

	//数组的for-range遍历
	for index, val := range arr {
		fmt.Println(index, val)
	}
	for idx := range arr {
		fmt.Println("idx:", idx)
	}
	arrayFunc(&arr3)
	fmt.Println(arr3)

	// 1.切片可以直接从数组引用
	sl := arr[:2]
	fmt.Println(sl)

	slice := arr2[1:4:7]  // 这种切片长度为前两个参数截断，后一个参数为切片容量
	fmt.Println("三个参数切片",slice)
	fmt.Println(cap(slice))


	// 2. var 切片名 []type = make([]type. len, cap)
	// type 数据类型， len 长度， cap 指定切片容量【可选，如果指定了cap，那么必须cap>=len】
	var sl2 = make([]int, 5)
	fmt.Println(sl2)
	fmt.Println("len_sl2:", len(sl2))
	fmt.Println("cap_sl2:", cap(sl2))

	// 3. 直接定义，指定具体数组。如上arr5
	sl3 := []int{1,2,3}
	// 追加一个切片，append(slice1,slice2...) slice...为固定格式
	sl4 := append(sl3, sl3...)
	fmt.Println("sl3 sl4:", sl3, sl4)
	fmt.Printf("%T\n",sl4)
	fmt.Println(sl4[3])

	// 拷贝操作
	//if len(sl2) + len(sl4) > cap(sl2){
	//	sl2 = sl2[0:len(sl2) * 2]
	//}
	copy(sl2, sl4)  // 将sl4拷贝到sl2中，如长度限制，按拷贝后的切片长度取值。数据独立
	fmt.Println("copy:", sl2, sl4)

	sl2 = append(sl2, sl4...)
	fmt.Println("append:", sl2, sl4)

	fmt.Println(arr5)
	ar := arr5[:]
	ar[3] = 10
	fmt.Println(ar)
	fmt.Println(arr5)
	fmt.Println(len(arr5))

	items := [...]int{10, 20, 30, 40, 50}
	//for _, item := range &items {
	//	fmt.Println(item)
	//	item *= 2
	//}
	for idx := range items {
		items[idx] *= 2
	}
	fmt.Println("==",items)

	var l = []interface{}{"hehe", 2}
	l = append(l, "haha")
	l = append(l, 1)
	fmt.Println(l)
}
